package com.example.kotlin01.repository

import com.example.kotlin01.ControlledRunner
import com.example.kotlin01.SingleRunner
import com.example.kotlin01.dao.UserDao
import com.example.kotlin01.model.User

class UserRepository(val userDao: UserDao) {
    val controllerRuuner = ControlledRunner<List<User>>()

    val singleRunner = SingleRunner()

    var controlledRunner = ControlledRunner<List<User>>()

    // 方案 1: 取消之前的任务

    // 对于排序和过滤的情况，新请求进来，取消上一个，这样的方案是很适合的。
    suspend fun queryUser(): List<User> {
        // 在开启新的排序之前，先取消上一个排序任务
//        return controllerRuuner.cancelPreviousThenRun {
//            userDao.queryUser()
//        }
// 开始新的任务之前，等待之前的排序任务完成
//        return singleRunner.afterPrevious  {
//            userDao.queryUser()
//        }

        // 如果已经有一个正在运行的请求，那么就返回它。如果没有的话，开启一个新的请求。
        return controlledRunner.joinPreviousOrRun {
            userDao.queryUser()
        }
    }

    suspend fun addUser(user: User) {
        return userDao.addUser(user)
    }

    suspend fun deleteUser(user: User) {
        return userDao.deleteUser(user)
    }
}